<?php
/**
 * YuToriUtils
 * YuToriPHPFramework用ユーティリティ集
 * 
 * @since 2012/01/17
 * 
 */
class YuToriUtils {
	public function __construct () {
		$Utils = Y()->add('Util', $this);
		$Utils->add('loadModule', Y::func(array($this, 'loadModule')));
	}
	
	/**
	 * モジュールを読み込む。
	 * モジュールはmodulesディレクトリ直下、およびもう１段階下まで検索し、最初に発見した「モジュール名.php」ファイルを読み込む。
	 * そのため、モジュール本体以外のphpファイルが存在する場合は、modulesディレクトリの２階層下のディレクトリに配置することを推奨。
	 * 読み込んだモジュールがModule配下に入るかどうかはモジュール次第。
	 * 
	 * @since 2012/01/17
	 * @return bool 読み込みに成功したらtrue。失敗した場合はfalse。
	 */
	public function loadModule ($Module) {
		Y('Log.d')->call('モジュール読み込み開始:'.$Module);
		// ファイル名はすべて小文字。できれば大文字小文字の制限はなしにしたい。
		$Module = strtolower ($Module);
		// モジュールがロード済みなら何もしない
		if (!Y('Module.'.$Module)->isEmpty()) return true;
		// モジュールディレクトリを検索
		foreach (scandir (DIR_MODULES) as $dir) {
			if ($dir == '.' || $dir == '..') continue;
			$fulldir = DIR_MODULES.'/'.$dir;
			if (is_dir($fulldir)) {
				foreach (scandir ($fulldir) as $file) {
					if ($file == '.' || $file == '..') continue;
					if (is_file($fulldir.'/'.$file) && strcasecmp ($file, $Module.'.php') === 0) {
						include $fulldir.'/'.$file;
						return true;
					}
				}
			} elseif (is_file ($dir) && strcasecmp ($dir, $Module.'.php') === 0) {
				include $dir;
				return true;
			}
		}
		Y('Log.d')->call('モジュールの読み込みに失敗');
		return false;
	}
}

new YuToriUtils ();